package org.jsola.contract.service;

import org.jsola.contract.dao.ICategoryDAO;
import org.jsola.contract.dto.CategoryAddDTO;
import org.jsola.contract.dto.CategoryUpdateDTO;
import org.jsola.contract.dto.IssuedCategoryAddDTO;
import org.jsola.contract.entity.CategoryDO;
import org.jsola.contract.query.CategoryQuery;
import org.jsola.contract.vo.CategoryListVO;
import org.jsola.contract.vo.CategoryVO;
import org.jsola.contract.vo.ContractGroupListVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 合同类型
 *
 * @author JanusMix
 */
public interface ICategoryService extends IService<ICategoryDAO, CategoryDO> {

    /**
     * 新增合同类型
     *
     * @param categoryAddDTO 新增合同类型DTO
     * @param tokenUser      当前用户
     * @return 合同类型详情信息
     */
    CategoryVO save(CategoryAddDTO categoryAddDTO, TokenUser tokenUser);

    /**
     * 新增合同类型(没有业务逻辑，纯新增合同类型)
     *
     * @param categoryAddDTO 新增合同类型DTO
     * @param tokenUser      当前用户
     * @return 合同类型详情信息
     */
    CategoryVO saveNoLogic(CategoryAddDTO categoryAddDTO, TokenUser tokenUser);


    /**
     * 批量新增合同类型
     *
     * @param categoryAddDTOList 新增合同类型DTO
     * @param tokenUser          当前用户
     * @return 合同类型详情信息
     */
    List<CategoryVO> batchSave(List<CategoryAddDTO> categoryAddDTOList, TokenUser tokenUser);

    /**
     * 修改合同类型
     *
     * @param categoryUpdateDTO 修改合同类型DTO
     * @param tokenUser         当前用户
     * @return 更新数量
     */
    int update(CategoryUpdateDTO categoryUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除合同类型，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser   当前用户
     * @param categoryIds 合同类型id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... categoryIds);

    /**
     * 根据合同类型id查找
     *
     * @param categoryId 合同类型id
     * @param siteId     所属站点id
     * @return 合同类型详情信息
     */
    CategoryVO selectById(Long categoryId, String siteId);

    /**
     * 根据idList获取分类
     *
     * @param categoryIds id列表
     * @return list
     */
    List<CategoryDO> selectByIds(List<Long> categoryIds);

    /**
     * 查询合同类型
     *
     * @param categoryQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同类型列表信息
     */
    List<CategoryListVO> select(CategoryQuery categoryQuery, String siteId);

    /**
     * 查询公司下合同类型（分组-类型 树形展示）
     *
     * @param subjectId 业务id(目前指公司id)
     * @param name      筛选姓名
     * @param tokenUser 当前用户
     * @return 公司下合同类型（分组-类型 树形展示）
     */
    List<ContractGroupListVO> selectTreeBySubjectId(String subjectId, String name, TokenUser tokenUser);

    /**
     * 查询合同类型记录数
     *
     * @param categoryQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同类型记录数
     */
    int selectCount(CategoryQuery categoryQuery, String siteId);

    /**
     * 分页查询合同类型
     *
     * @param categoryQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同类型列表信息
     */
    Page<CategoryListVO> selectPage(CategoryQuery categoryQuery, String siteId);


    /**
     * 根据合同类型id查找
     *
     * @param categoryId 合同类型id
     * @param siteId     所属站点id
     * @return 合同类型
     */
    CategoryDO selectDOById(Long categoryId, String siteId);

    /**
     * 查询合同类型
     *
     * @param categoryQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同类型列表
     */
    List<CategoryDO> selectDO(CategoryQuery categoryQuery, String siteId);

    /**
     * 查询分组下的分类
     *
     * @param groupId 分组id
     * @param siteId  站点id
     * @return 类型DO列表
     */
    List<CategoryDO> selectByGroupId(Long groupId, String siteId);

    /**
     * 获取某业务的所有类型
     *
     * @param subjectId 分组id
     * @param siteId    站点id
     * @return 类型DO列表
     */
    List<CategoryDO> listBySubjectId(String subjectId, String siteId);

    /**
     * 查询某印章是否被合同类型所使用
     *
     * @param sealId 印章id
     * @param siteId 站点id
     * @return true or false
     */
    Boolean isSealIdUsed(Long sealId, String siteId);


    /**
     * 下发合同模版到公司
     *
     * @param issuedCategoryAddDTO 合同模版
     * @param tokenUser            登录用户
     * @return 合同类型
     */
    List<CategoryVO> saveIssuedCategory(IssuedCategoryAddDTO issuedCategoryAddDTO, TokenUser tokenUser);

    /**
     * 查询用工单位分组下指定名称合同类型
     *
     * @param subjectId         公司Id
     * @param contractGroupName 分组名称（提示信息用 不用做查询条件）
     * @param names             模板名称
     * @param tokenUser         登录用户
     * @return 分组下同名模板
     */
    @Deprecated
    List<CategoryDO> selectBySubjectIdAndNames(String subjectId, String contractGroupName, List<String> names, TokenUser tokenUser);

    /**
     * 查询用工单位下指定名称合同类型
     *
     * @param subjectIds         公司Id
     * @param names             模板名称
     * @param tokenUser         登录用户
     * @return 分组下同名模板
     */
    List<CategoryDO> selectBySubjectIdsAndNames(List<String> subjectIds, List<String> names, TokenUser tokenUser);

    /**
     * 查询用工单位下使用指定印章合同类型
     *
     * @param subjectIds        公司Id
     * @param enterpriseSealIds 企业印章Id
     * @param tokenUser         登录用户
     * @return 分组下同名模板
     */
    List<CategoryDO> selectBySubjectIdsAndEnterpriseSealId(List<String> subjectIds
            , List<Long> enterpriseSealIds, TokenUser tokenUser);

    /**
     * 添加印章相关信息
     * @param categoryListVO 合同类型
     * @param tokenUser 当前用户
     */
    void setSealVO(CategoryListVO categoryListVO, TokenUser tokenUser);


    /**
     * 检查该合同分类对应的唯一模板是否具备发起合同的所有条件
     * @param categoryListVO 合同类型
     * @param tokenUser 当前用户
     * @return true or false
     */
    boolean checkTemplate(CategoryListVO categoryListVO, TokenUser tokenUser);

    /**
     * 检查该合同分类对应的唯一模板是否具备发起合同的所有条件
     * @param categoryVO 合同类型
     * @param tokenUser 当前用户
     * @return true or 报错
     */
    String checkTemplate(CategoryVO categoryVO, TokenUser tokenUser);

}


